package net.freestu.sola.web.spider.urlfilter;

import net.freestu.sola.web.global.GlobleVar;

/**
 * 该过滤器是按照后缀名的原理初步把一些常见的，非网页的URL过滤掉，其实这个也可以用报头中text/html过滤掉（在程序的过滤中也有）。
 * 这样写是为了能够提高效率，而不必每一个URL都链接服务器。
 * 
 * @author 秋刀鱼的滋味
 *
 */
public class NewPostfixFilter extends FilterDecorator{
	
	
	  public NewPostfixFilter(LinkFilter linkfilter){
			
			super(linkfilter);
			
		}
		
		//这个函数的质量有点高。复用性非常好。
		public void setState(){//检测状态。对LinkFilter的状态进行设置。这个貌似可以设置成private
			
			String str=linkfilter.getContent();//获取URL。
			int state=linkfilter.getState();//获取状态。
			
			
			if(state==URLFORBID){//如果不是不能通过的。
				
				linkfilter.setState(URLFORBID);
			}
			
			
			if(state==URLSTOP){//如果是处于暂停状态的。
				
				int temp=judgeState(str);
				linkfilter.setState(temp);
			}
			
			
			
			if(state==URLPASS){//如果是处于通过状态，至高无上的通过权利。所以这个地方设置为URLPASS的时候，倍加小心
				
				//--------------9.24修改----------
				//int temp=judgeState(str);//按照逻辑来判定。
				//linkfilter.setState(temp);//
				//------------------------------
				
			   //URLPASS应该是至高无上的通行证。
				
				linkfilter.setState(URLPASS);
				
				
			}
			
			
		}
		
		
		public String getLinkAfterFilter(){//得到过滤后的链接。
			
			setState();//先设置状态。
			
			if(linkfilter.getState()==URLPASS){
				
				return linkfilter.getContent();
				
				}
			if(linkfilter.getState()==URLSTOP){//如果到最后还没有设置为Forbid时，则自动申明为URLPASS
				
				return linkfilter.getContent();
				}
			
			if(linkfilter.getState()==URLFORBID){
				
				return null;
				}
			
			return null;
		}
		
		
		/**
		 * 核心方法。
		 * @param str
		 * @return
		 */
		private int judgeState(String str){//成功。
			
                boolean s=true;			    
			    String sign=GlobleVar.OTHER_TYPE;
				String[] signs=sign.split("\\s");
				for(String temp:signs){
					//if(str.toLowerCase().endsWith(temp)){//如果是符合后缀名的。
					
					if(str.trim().toLowerCase().endsWith(temp)){//修改，有后缀 .jpg 。
						s=false;
					}
				}
				if(s==true){
					return URLSTOP;//这个地方不能设置为URLPASS，如果设置为URLPASS时则表示不进行下一轮过滤了。
				}else{
					return URLFORBID;
				}
	   }
					
		public String getContent(){//在几个装饰器之间用这个函数传递。
			
			return getLinkAfterFilter();
		}
		
		//垃圾方法
		public int getState(){
			
			setState();
			
			return linkfilter.getState();//这个地方有点错。这个地方必须设置成反应后的啊
		}

	  public void setState(int i){
	  	
	  	linkfilter.setState(i);
	  }
	  	
	  
	  public static void main(String[] args){
	  	
	  	
	  	//MyLink ml1=new MyLink("http://www.cdut.edu.cn/cdut/uploadfiles/uf1190532725399.gif");
		//MyLink ml1=new MyLink("http://www.zuzhibu.cdut.edu.cn/admin/a.js"); 
	  	
	  	//LinkFilter lfb=new LinksForbider(ml1);//
	  	//NewPostfixFilter ml2=new NewPostfixFilter(lfb);
	  	//String str=ml2.getLinkAfterFilter();
	  	//System.out.println(str);
	  	
	  	
	  	
	  	MyLink ml = new MyLink("http://202.115.128.240:8080/index.htm");
		//如果这个地方将name的值设置成ip地址了的话就没必要在这个地方过滤IP了。
		//这里还是需要先按文件名过滤。提高速度！！
		//不过这个地方的的后缀过滤过滤掉一些常见的(.jpg .wav .mp3)等文件。自定义的文件在后面网页内容过滤器的时候过滤掉。
		
	  	
		LinkFilter lfb=new LinksForbider(ml);
		LinkFilter pf = new NewPostfixFilter(lfb);// 按照后缀名过滤。
		LinkFilter ipf=new IPFilter(pf);//貌似这个地方没必要IP过滤器。因为如果是多线程的，有另外一些站点对这个进行下载
		LinkFilter wf = new WebFilter(ipf, "cdut.edu.cn");// 按照站点过滤。!!!这个地方以后需要动态分配。
		
	  	
	  	
	  	/*
		LinkFilter lfb=new LinksForbider(ml);
		LinkFilter pf = new NewPostfixFilter(lfb);// 按照后缀名过滤。                                                                                                                                                
		
		LinkFilter ctf=new ContentTypeFilter(pf);//按照报头中content-type,这个还可以过滤掉没有连接的URL.
		LinkFilter wf = new WebFilter(pf, "cdut.edu.cn");// 按照站点过滤。!!!这个地方以后需要动态分配。
		*/



		String ss = wf.getLinkAfterFilter();
		
	  	
	  	
	  	System.out.println(ss);
	  	
	  	
	  	
	  }


		
	}
